package fr.ul.ade.prime.analyzer;

import fr.ul.ade.prime.config.Config;
import fr.ul.ade.prime.exception.InvalidQrCodeException;

/**
 * Parse l'URL retournée par le scan QRCode pour y récupérer les ressources,
 * l'id du projet, la date de début et de fin de la période sur laquelle
 * extraire l'emploi du temps. Exemple d'URL :
 * <code>http://ade-planification.uhp-nancy.fr/jsp/custom/modules/plannings/anonymous_cal.jsp?resources=6180,6235,2815,6251,6281,7649,7786,21888,21889&projectId=5&calType=ical&firstDate=2012-08-27&lastDate=2013-07-14</code>
 * 
 * @author Zanette Sébastien
 * @version 1.1
 */
public class ParserQRCode {

	@SuppressWarnings("unused")
	private static final String TAG = ParserQRCode.class.getSimpleName();

	public ParserQRCode() {
		super();
	}

	/**
	 * Parse l'url en paramètre pour retourner les ressources de l'emploi du
	 * temps.
	 * 
	 * @param url
	 * @return les ressources de l'emploi du temps séparées par des '|'
	 * @throws InvalidQrCodeException
	 *             si l'url fournie n'est pas valide
	 */
	public static String getResources(String url) throws InvalidQrCodeException {
		int start = url.indexOf(Config.URL_RESOURCES);
		if (start == -1) {
			throw new InvalidQrCodeException(url);
		}// if
		String urlTemp = url.substring(start);
		int end = urlTemp.indexOf(Config.URL_PARAM_SEPARATOR);
		if (end == -1) {
			end = urlTemp.length();
		}// if
		return urlTemp.substring(0, end)
				.replaceAll(Config.URL_RESOURCES, "") //$NON-NLS-1$
				.replaceAll(Config.URL_RESOURCES_SEPARATOR,
						Config.RESOURCE_SEPARATOR);
	}

	/**
	 * Parse l'url en paramètre pour retourner l'id du projet de l'emploi du
	 * temps.
	 * 
	 * @param url
	 * @return l'id du projet de l'emploi du temps
	 * @throws InvalidQrCodeException
	 *             si l'url fournie est invalide
	 */
	public static String getProjectId(String url) throws InvalidQrCodeException {
		int start = url.indexOf(Config.URL_PROJECT_ID);
		if (start == -1) {
			throw new InvalidQrCodeException(url);
		}// if
		String urlTemp = url.substring(start);
		int end = urlTemp.indexOf(Config.URL_PARAM_SEPARATOR);
		if (end == -1) {
			end = urlTemp.length();
		}// if
		return urlTemp.substring(0, end).replaceAll(Config.URL_PROJECT_ID, ""); //$NON-NLS-1$
	}

	/**
	 * Parse l'url en paramètre pour retourner la date de début de la période de
	 * synchronisation de l'emploi du temps.
	 * 
	 * @param url
	 * @return la date de début de la période de synchronisation de l'emploi du
	 *         temps
	 * @throws InvalidQrCodeException
	 *             si l'url fournie est invalide
	 */
	public static String getFirstDate(String url) throws InvalidQrCodeException {
		int start = url.indexOf(Config.URL_FIRST_DATE);
		if (start == -1) {
			throw new InvalidQrCodeException(url);
		}// if
		String urlTemp = url.substring(start);
		int end = urlTemp.indexOf(Config.URL_PARAM_SEPARATOR);
		if (end == -1) {
			end = urlTemp.length();
		}// if
		return urlTemp.substring(0, end).replaceAll(Config.URL_FIRST_DATE, ""); //$NON-NLS-1$
	}

	/**
	 * Parse l'url en paramètre pour retourner la date de fin de la période de
	 * synchronisation de l'emploi du temps.
	 * 
	 * @param url
	 * @return la date de fin de la période de synchronisation de l'emploi du
	 *         temps
	 * @throws InvalidQrCodeException
	 *             si l'url fournie est invalide
	 */
	public static String getLastDate(String url) throws InvalidQrCodeException {
		int start = url.indexOf(Config.URL_LAST_DATE);
		if (start == -1) {
			throw new InvalidQrCodeException(url);
		}// if
		String urlTemp = url.substring(start);
		int end = urlTemp.indexOf(Config.URL_PARAM_SEPARATOR);
		if (end == -1) {
			end = urlTemp.length();
		}// if
		return urlTemp.substring(0, end).replaceAll(Config.URL_LAST_DATE, ""); //$NON-NLS-1$
	}
}
